home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
011
/
menubar1.arc
/
MENUBAR1.C
Wrap
Text File
|
1986-04-04
|
8KB
|
208 lines
/********************* menubar1.c *************************/
/* experiments with a single level lotus type menu bar
** for those who want to save or unclutter screen space
** written in DeSmet C88 by Dieter Schweiss 2/13/85
** you are free to use and improve these functions,
** send any comments to: Dieter Schweiss
762 Larkwood Dr
Holland, MI 49423
*/
#define CLS scr_clr(); scr_rowcol(0,0)
#define TRUE 1
#define FALSE 0
#define M1MAX 5 /* number of commands, change as needed */
main() /* test the menu_bar1() function, remove main() */
{ /* and go_on() and insert your own program */
int command;
CLS;
while (TRUE) {
scr_clr();
scr_rowcol(10,0);
command = menu_bar1();
switch (command) {
case 'R' : puts("\t Reading file");
go_on(); break;
case 'W' : puts("\t Writing file");
go_on(); break;
case 'P' : puts("\t Preparative display");
go_on(); break;
case 'T' : puts("\t Tabular display");
go_on(); break;
case 'Q' : puts("\t Do you want to exit program (y/n)? ");
if (tolower(getchar()) == 'y')
exit();
break;
}
} /* endless while loop */
}
menu_bar1() /* Generates a single level lotus like menu bar. Move */
/* left/right cursors to highlight command then press */
/* ENTER or type first letter of command. Returns the */
/* command letter. Change menu[], detail[] and switch */
/* /case constants for your own needs. For additional */
/* commands change M1MAX. */
/* Written in DeSmet C88 by Dieter Schweiss 2/13/85 */
{
static char menu1[M1MAX][13] =
"Read ",
"Write ",
"Prep ",
"Table ",
"Quit";
static char detail[M1MAX][61] =
"Read a data file from disk",
"Write present data to disk",
"Display the data in a preparative format",
"Display the data in a tabular format",
"Quit the program and return to DOS";
static char m1_tot[M1MAX * 12]; /* menu1 total string */
char m1_let[M1MAX]; /* starting letters of menu1 */
int m1_col[M1MAX]; /* starting columns of menu1 */
int col;
int row = 0; /* start at first row, change if needed */
int black_w = 0x70; /* black on white */
int green_b = 0x02; /* green on black */
int k;
int command1; /* letter of command */
char done;
char c; /* keyboard input */
col = m1_tot[0] = 0; /* reset */
for (k = 0; k < M1MAX; k++) {
strcat(m1_tot,menu1[k]); /* form total menu string */
m1_col[k] = col; /* initialize location */
m1_let[k] = menu1[k][0]; /* initial letter */
col += strlen(menu1[k]);
}
col = k = 0; /* reset */
putsrcc(m1_tot,row,col,green_b);
menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
for ( ;; ) {
c = scr_ci();
if (c == 3) break; /* control C */
if (isalpha(c)) c = toupper(c); /* convert to upper case */
done = FALSE;
switch (c) {
case 28 : k++; /* right arrow */
if (k >= M1MAX) k = 0;
putsrcc(m1_tot,row,col,green_b);
menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
break;
case 29 : k--; /* left arrow */
if (k < 0) k = M1MAX -1;
putsrcc(m1_tot,row,col,green_b);
menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
break;
case 13 : command1 = m1_let[k];
done = TRUE;
break;
case 'R' : k = 0; /* first command in menu1[] */
command1 = m1_let[k];
done = TRUE;
putsrcc(m1_tot,row,col,green_b);
menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
break;
case 'W' : k = 1; /* second command in menu1[] */
command1 = m1_let[k];
done = TRUE;
putsrcc(m1_tot,row,col,green_b);
menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
break;
case 'P' : k = 2; /* third command etc. */
command1 = m1_let[k];
done = TRUE;
putsrcc(m1_tot,row,col,green_b);
menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
break;
case 'T' : k = 3;
command1 = m1_let[k];
done = TRUE;
putsrcc(m1_tot,row,col,green_b);
menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
break;
case 'Q' : k = 4; /* fifth and last command */
command1 = m1_let[k]; /* enter more if needed */
done = TRUE;
putsrcc(m1_tot,row,col,green_b);
menu_bar2(menu1[k],detail[k],row,m1_col[k],black_w,green_b);
break;
default : putchar(7); break;
}
if (done) break;
} /* endless for loop */
return(command1);
}
menu_bar2(command,detail,row,col,cmd_color,dtl_color) /* part of menu_bar1() */
char *command, *detail;
int row, col;
int cmd_color, dtl_color;
{
static char blanks60[] =
" ";
putsrcc(command,row,col,cmd_color);
putsrcc(blanks60,row+1,0,dtl_color);
putsrcc(detail,row+1,0,dtl_color);
return;
}
putsrcc(string,row,col,color) /* print a string in color at given location */
/* added screen_type() video mode detector */
char string[]; /* DeSmet C88 Dieter Schweiss 2/13/85 */
int row; /* 0 to 24 */
int col; /* 0 to 79 */
int color; /* eg. 0x1 to 0xF = black background */
{ /* eg. 0x70 to 0x7E = white background */
int len, k;
char str[160]; /* length of 1 row, includes attribute */
unsigned current_seg;
unsigned target_ofs, target_seg;
target_seg = screen_type() + row * 10;
target_ofs = col * 2; /* row has 160 bytes incl. attribute */
current_seg = _showds();
len = 2 * strlen(string);
for (k = 0; k <= len; k++) {
if (k % 2)
str[k] = color; /* odd elements are attributes */
else
str[k] = string[k/2]; /* even elements are ASCII values */
}
_lmove(len,str,current_seg,target_ofs,target_seg); /* do it */
return;
}
screen_type() /* peek 0040:0010 for monitor adaptor type */
/* returns starting segment of screen */
{ /* DeSmet C88 V 2.5 Dieter Schweiss 3/3/86 */
if (((peek(0x10,0x40)) & 48) == 48)
return(0xB000); /* monochrome screen start-segment */
else
return(0xB800); /* color graphics adaptor assumed */
}
go_on()
{
int k, n;
for (k = 1; k < 10; k++) {
putchar('.');
for (n = 1; n < 10000; n++); /* delay */
}
puts("\t Press ENTER to go on .... ");
getchar();
return;
}